/**异常处理
 * 多catch语句 try{}catch(){}catch()finally(){}
 * finally语句块保证有无错误都会执行
 *catch的顺序非常重要：子类必须写在前面,见下图
 *                      ┌───────────┐
 *                      │  Object   │
 *                      └───────────┘
 *                            ▲
 *                      ┌───────────┐
 *                      │ Throwable │
 *                      └───────────┘
 *                            ▲
 *                  ┌─────────┴─────────┐
 *            ┌───────────┐       ┌───────────┐
 *            │   Error   │       │ Exception │
 *            └───────────┘       └───────────┘
 *                  ▲                   ▲
 *          ┌───────┘              ┌────┴──────────┐
 * ┌─────────────────┐    ┌─────────────────┐┌───────────┐
 * │OutOfMemoryError │... │RuntimeException ││IOException│...
 * └─────────────────┘    └─────────────────┘└───────────┘
 *                                 ▲
 *                     ┌───────────┴─────────────┐
 *          ┌─────────────────────┐ ┌─────────────────────────┐
 *          │NullPointerException │ │IllegalArgumentException │...
 *          └─────────────────────┘ └─────────────────────────┘
 *
 *          Exception
 * ├─ RuntimeException
 * │  ├─ NullPointerException
 * │  ├─ IndexOutOfBoundsException
 * │  ├─ SecurityException
 * │  └─ IllegalArgumentException
 * │     └─ NumberFormatException
 * ├─ IOException
 * │  ├─ UnsupportedCharsetException
 * │  ├─ FileNotFoundException
 * │  └─ SocketException
 * ├─ ParseException
 * ├─ GeneralSecurityException
 * ├─ SQLException
 * └─ TimeoutException
 * */


public class Main {
    public static void main(String[] args ) throws Exception {

    try {

    }catch (Exception e) {

    }catch (Error e){

    }finally {

    }
//---抛出异常---
    //创建某个Exception的实例；
    //用throw语句抛出。
    //但是一般仅抛出一个异常便停止
    //在极少数的情况下，我们需要获知所有的异常。如何保存所有的异常信息？
    // 方法是先用origin变量保存原始异常，然后调用Throwable.addSuppressed()，把原始异常添加进来，最后在finally抛出：
        Exception origin = null;

        try {
            System.out.println(Integer.parseInt("abc"));
        } catch (Exception e) {
            origin = e;
            throw e;
        } finally {
            Exception e = new IllegalArgumentException();
            if (origin != null) {
                e.addSuppressed(origin);
            }
            throw e;
        }

//断言assert
//        double x = Math.random();
//        assert x >= 0 : "x must >= 0";

    }


}